/*
 *英才汇硕信息科技有限公司 拥有本软件版权 2021  并保留所有权利。
 *Copyright 2021, YCHS Information&Science Technology Co.,Ltd,
 *All rights reserved.
 */
package com.yckj.dao;

import com.yckj.domain.User;
import com.yckj.util.DbUtilHikari;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import cn.hutool.crypto.SecureUtil;

/**
 * 对用户表的操作：注册、删除、查询、修改用户
 * @author liuzhan
 * @version 1.0
 */
public class UserDao {
    /**
     * 查询所以用户
     * @return 包含所有用户对象的集合
     */
     public List<User> selectAllUser(){
         //创建一个空集合，准备放用户对象
       List<User> userList = new ArrayList<User>();
       Connection coon = null;
       PreparedStatement pstmt = null;
       ResultSet rs = null;
       coon = DbUtilHikari.getConnection();
       String sql = "SELECT userid,username,userpsw FROM users";
         try {
             pstmt = coon.prepareStatement(sql);
             rs = pstmt.executeQuery();
             //把rs里的数据转移到userList集合里
             while (rs.next()){
                 //user当前是空的
                 User user = new User();
                 user.setUserid(rs.getInt("userid"));
                 user.setUsername(rs.getString("username"));
                  user.setUserpsw(rs.getString("userpsw"));

                 userList.add(user);
             }
         } catch (SQLException throwables) {
             throwables.printStackTrace();
         } finally {
             DbUtilHikari.close(rs,pstmt,coon);
         }
         return userList;
     }
    /**
     * 修改用户信息
     * @param userid 用户编号
     * @param uname 用户名
     * @param upsw 密码
     * @return 修改成功返回1，否则返回0
     */
    public int updateUser(int userid,String uname,String upsw){
        int flag = 0;
        Connection conn = null;
        PreparedStatement pstmt = null;

        conn = DbUtilHikari.getConnection();
        String sql = "UPDATE users SET username=?,userpsw=? WHERE userid=?";
        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,uname);
            pstmt.setString(2,SecureUtil.md5(upsw));
            pstmt.setInt(3,userid);
            flag = pstmt.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            DbUtilHikari.close(pstmt,conn);
        }
        return flag;
    }
    /**
     * 按照用户编号删除用户
     * @param userid 用户编号
     * @return 删除成功返回1，否则返回0
     */
    public int deleteUser(int userid){
        int flag = 0;
       //声明一些变量
        Connection conn = null;
        PreparedStatement pstmt = null;
        //获取数据库连接
        conn = DbUtilHikari.getConnection();
        //定义并准备SQL语句
        String sql = "DELETE FROM users WHERE userid=?";
        try {
            pstmt = conn.prepareStatement(sql);
            //给？赋值
            pstmt.setInt(1,userid);
            //执行SQL语句
            flag = pstmt.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            //关闭资源(释放资源）
            DbUtilHikari.close(pstmt,conn);
        }


        return flag;
    }
    /**
     * 按用户名和密码登录
     * @param uname 用户名
     * @param upsw 密码
     * @return 如果登录成功返回true,否则返回false
     */
    public boolean login(String uname,String upsw){
        //flag是登陆成功与否的标志
        boolean flag = false;
        //conn表示数据库连接
        Connection conn = null;
        //pstmt是执行SQL语句的
        PreparedStatement pstmt = null;
        //rs代表结果集，从数据库表里查到的结果放到rs里
        ResultSet rs = null;

        //获得数据库连接;从连接池里获取,不是直接从数据库打开连接
        //用连接池能提高数据库访问性能，特别是大并发场景下
        conn = DbUtilHikari.getConnection();
        //定义并准备SQL语句,登录是查询语句select
        String sql = "SELECT * FROM users WHERE username=? AND userpsw=?";
        try {
            pstmt = conn.prepareStatement(sql);
            //给？赋值
            pstmt.setString(1,uname);
            pstmt.setString(2,SecureUtil.md5(upsw));
            //下达执行指令,执行SQL语句
            rs = pstmt.executeQuery();
            //判断rs结果集有没有数据
            if (rs.next()){
                flag = true;
            }else {
                flag = false;
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            //关闭资源
            DbUtilHikari.close(rs,pstmt,conn);
        }
        return flag;

    }

    /**
     * 用户注册
     * @param uname 用户名
     * @param upsw 密码
     * @return 注册成功返回1，否则返回0
     */

    public int insertUser(String uname,String upsw){
        //1.声明一些变量
        //代表数据库链接
        Connection conn = null;
        //预编译对象，用pstmt执行SQL语句
        PreparedStatement pstmt = null;
        //注册成功与否的标志:0失败，1成功
         int flag = 0;
        //2.获取链接
        conn = DbUtilHikari.getConnection();
        //3.定义并准备SQL语句
        String sql = "INSERT INTO users(username,userpsw) VALUES(?,?)";
        try {
            pstmt = conn.prepareStatement(sql);
            //4.给？赋值
            pstmt.setString(1,uname);
            pstmt.setString(2,SecureUtil.md5(upsw));
            //5.执行SQL语句（下达执行语句）
            flag = pstmt.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            //6.关闭数据库资源
            DbUtilHikari.close(pstmt,conn);
        }

        return flag;
    }
}
